home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / modula2 / lpr / conversi.mod < prev    next >
Encoding:
Modula Implementation  |  1994-09-22  |  2.3 KB  |  87 lines

  1. IMPLEMENTATION MODULE Conversions;
  2.  
  3.     FROM SYSTEM IMPORT LONG,SHORT;
  4.  
  5.     VAR digit  : ARRAY [0..36] OF CHAR;
  6.     
  7.     PROCEDURE ConvertToString
  8.           (n : LONGCARD; b : CARDINAL; neg : BOOLEAN; 
  9.            VAR s : ARRAY OF CHAR; VAR done : BOOLEAN);
  10.       VAR pos, i : CARDINAL;
  11.           m,fct  : LONGCARD;
  12.           base   : LONGCARD;
  13.       BEGIN
  14.         done:=(HIGH(s)>=33) & (2<=b) & (b<=36);
  15.         IF ~done THEN RETURN END;
  16.         base:=LONG(b);
  17.         fct:=1;
  18.         i:=1;
  19.         WHILE n DIV fct>=base DO
  20.           fct:=fct*base;
  21.           INC(i);
  22.         END;
  23.         pos:=0;
  24.         IF neg THEN 
  25.           s[pos]:='-';
  26.           INC(pos)
  27.         END;
  28.         WHILE i>0 DO
  29.           m:=n DIV fct;
  30.           s[pos]:=digit[SHORT(m)];
  31.           n:=n-m*fct;
  32.           fct:=fct DIV base;
  33.           DEC(i);
  34.           INC(pos)
  35.         END;
  36.         s[pos]:=0C
  37.       END ConvertToString;
  38.     
  39.     PROCEDURE ConvertFromString
  40.           (VAR s : ARRAY OF CHAR; b : CARDINAL; neg : BOOLEAN; 
  41.            max : LONGCARD; VAR result : LONGCARD; VAR done : BOOLEAN);
  42.       VAR pos : CARDINAL;
  43.           m,base : LONGCARD;
  44.           n : RECORD 
  45.                 CASE : BOOLEAN OF
  46.                   TRUE : c : LONGCARD |
  47.                   FALSE: i : LONGINT
  48.                 END
  49.               END;
  50.       BEGIN
  51.         done:=(2<=b) & (b<=36) & (LONG(2)<=max);
  52.         IF ~done THEN RETURN END;
  53.         pos:=0;
  54.         WHILE s[pos]=' ' DO INC(pos) END;
  55.         IF neg THEN
  56.           neg:=s[pos]='-';
  57.           IF neg OR (s[pos]='+') THEN INC(pos) END
  58.         END;
  59.         base:=LONG(b);
  60.         done:=('0'<=s[pos]) & (s[pos]<=digit[b-1]);
  61.         IF ~done THEN RETURN END;
  62.         n.c:=0;
  63.         WHILE ('0'<=s[pos]) & (s[pos]<=digit[b-1]) DO
  64.           done:=n.c<=max DIV base;
  65.           IF ~done THEN RETURN END;
  66.           m:=LONG(ORD(s[pos])-ORD('0'));
  67.           IF m>LONG(9) THEN DEC(m,ORD('A')-ORD('9')-1) END;
  68.           n.c:=n.c*base+m;
  69.           INC(pos);
  70.           done:=(pos<32) AND (n.c<=max);
  71.           IF ~done THEN RETURN END
  72.         END;
  73.         done:=s[pos]<=' ';
  74.         IF ~done THEN RETURN END;
  75.         IF neg THEN
  76.           n.i:=-n.i
  77.         END;
  78.         result:=n.c
  79.       END ConvertFromString;
  80.       
  81. BEGIN
  82.  
  83.   digit:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  84.   
  85. END Conversions.
  86.  
  87.